package apis

import (
	"gitee.com/sansaniot/ssiot-core/httpmvc/api"
	"gitee.com/sansaniot/ssiot-core/serrors"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"

	"ssalarm/internal/alarm/models"
	"ssalarm/internal/alarm/models/command"
	"ssalarm/internal/alarm/models/query"
	"ssalarm/internal/alarm/service"
)

type Alarm struct {
	api.Api
}

// 查询告警记录
func (e Alarm) FindAlarmList(c *gin.Context) {
	// 请求参数
	req := query.SysAlarmQuery{}
	// 模型
	m := models.SysAlarm{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 执行
	var result interface{}
	req.LoadUser(c)
	if err, result = m.FindAlarmList(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 返回
	e.Ok(result)
}

// 处理告警
func (e Alarm) ProcessAlarm(c *gin.Context) {
	// 请求参数
	req := command.AlarmIdReq{}
	// 业务service
	s := &service.SysAlarm{}
	// 模型
	sysAlarm := &models.SysAlarm{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&sysAlarm.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// service注入实体
	s.SetSysAlarmModel(sysAlarm)
	// 执行
	if err = s.ProcessAlarm(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 返回
	e.Ok(nil)
}

func (e Alarm) FindAlarmTop(c *gin.Context) {
	req := query.AlarmReportReq{}
	s := service.AlarmAnalyse{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	//用户信息
	req.LoadUser(c)
	res := make(map[string]interface{})
	if err = s.GetAlarmTop(&req, res); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	e.Ok(res)
}

func (e Alarm) FindAlarmTrend(c *gin.Context) {
	s := service.AlarmAnalyse{}
	req := query.AlarmReportReq{}
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	//用户信息
	req.LoadUser(c)
	res := make(map[string]interface{})
	if err = s.GetAlarmTrend(&req, res); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
	}
	e.Ok(res)
}

// 删除告警记录
func (e Alarm) RemoveAlarmRecord(c *gin.Context) {
	// 请求参数
	req := command.AlarmRemoveReq{}
	// 业务service
	s := &service.SysAlarm{}
	// 模型
	sysAlarm := &models.SysAlarm{}
	// 上下文
	err := e.MakeContext(c).
		MakeOrm().
		Bind(&req, binding.JSON).
		MakeModel(&sysAlarm.Model).
		MakeService(&s.Service).
		Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// service注入实体
	s.SetSysAlarmModel(sysAlarm)
	// 执行
	if err = s.RemoveAlarmRecord(&req); err != nil {
		e.Logger.Error(err)
		e.Fail(serrors.Fail)
		return
	}
	// 返回
	e.Ok(nil)
}

// 告警列表导出
func (e Alarm) ExportAlarmList(c *gin.Context) {
	req := query.SysAlarmQuery{}
	// 业务service
	s := &service.SysAlarm{}
	// 模型
	m := models.SysAlarm{}
	// 上下文
	err := e.MakeContext(c).Bind(&req).MakeModel(&m.Model).Errors
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	// 注入模型
	s.SetSysAlarmModel(&m)
	// 执行
	req.LoadUser(c)
	err = s.ExportAlarmList(c, &req)
	if err != nil {
		e.Logger.Error(err)
		e.Fail(0, err.Error())
		return
	}
	c.Abort()
}
